package ga;

import java.util.ArrayList;
import java.util.Random;


public class Selection {


	//os pais serão o melhores individuos de uma geracao + individuo aleatorio
	public static ArrayList<Individual> Tournament(ArrayList<Individual> pop){

		//copia da populacao
		ArrayList<Individual> copia = new ArrayList<Individual>();
		copia.addAll(pop);

		//pais
		ArrayList<Individual> pais = new ArrayList<Individual>();

		Individual pai1;
		Individual pai2;

		Random random = new Random();

		//enquanto a populacao for diferente de 0, pega o melhor e um numero aleatorio
		
		for (int i=0; i < pop.size() * 2; i ++){
			pai1 = pop.get(random.nextInt(pop.size()-1));
			pai2 = pop.get(random.nextInt(pop.size()-1));
			
			if (pai1.getFitness()>= pai2.getFitness()){
				pais.add(new Individual(pop.get(0).getF(), pai1.getGens()));
					
			}
			else{
				pais.add(new Individual(pop.get(0).getF(), pai2.getGens()));	
			}
		}
		return pais;
	}

	//os pais serão o melhores individuos de uma geracao + individuo aleatorio
	public static ArrayList<Individual> BestRandom(ArrayList<Individual> pop){

		//copia da populacao
		ArrayList<Individual> copia = new ArrayList<Individual>();
		copia.addAll(pop);

		//pais
		ArrayList<Individual> pais = new ArrayList<Individual>();

		double[] pai1;
		double[] pai2;

		Random random = new Random();

		//enquanto a populacao for diferente de 0, pega o melhor e um numero aleatorio
		while (copia.size() != 0){
			pai1 = copia.remove(0).getGens();
			pai2 = copia.remove(random.nextInt(copia.size())).getGens();
			pais.add(new Individual(pop.get(0).getF(), pai1));
			pais.add(new Individual(pop.get(0).getF(), pai2));
		}
		return pais;

	}


	public static ArrayList<Individual> Roullet(ArrayList<Individual> pop){

		ArrayList<Individual> pais = new ArrayList<Individual>();
		int tamanhoPopulacao = pop.size();
		int vencedorRoleta;
		double[] roleta = pso.Utility.criacaoRoleta(pop);
		double[] pai1;
		double[] pai2;

		for (int i = 0; i < tamanhoPopulacao; i++){
			
			vencedorRoleta = pso.Utility.vencedorRoleta(roleta);
			pai1 = pop.get(vencedorRoleta).getGens();
			vencedorRoleta = pso.Utility.vencedorRoleta(roleta);
			pai2 = pop.get(vencedorRoleta).getGens();
			pais.add(new Individual(pop.get(0).getF(), pai1));
			pais.add(new Individual(pop.get(0).getF(), pai2));
			
		}
		return pais;

	}

}
